package cn.tedu.charging.order.quartz;

import cn.tedu.charging.order.dao.mapper.OrderFaileMapper;
import cn.tedu.charging.order.dao.mapper.OrderSuccessMapper;
import cn.tedu.charging.order.dao.repository.OrderRepository;
import cn.tedu.charging.order.pojo.po.ChargingOrderFailPO;
import cn.tedu.charging.order.pojo.po.ChargingOrderSuccessPO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

import java.util.Date;
import java.util.UUID;

@Slf4j
public class DeviceCheckJob implements Job {
    public DeviceCheckJob() {
    }

    public DeviceCheckJob(String orderNo, Integer gunId) throws SchedulerException {
        log.debug("添加设备自检定时任务，订单号{},枪Id{}",orderNo,gunId);
//        创造调度器工厂
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
//        获取调度器
        Scheduler scheduler = schedulerFactory.getScheduler();
//        任务详情
        JobDetail jobDetail = JobBuilder.newJob(DeviceCheckJob.class)
//                定时任务的名称和组分类
                .withIdentity("device-check-job"+ UUID.randomUUID(),
                        "device-check-job-group")
                .usingJobData("orderNo",orderNo)
                .usingJobData("gunId",gunId)
                .build();
//        获取当前时间
        long now=System.currentTimeMillis();
//        任务执行时间为当前时间的一分钟以后
        long deviceCheckTime=now+ 60 * 1000;
//        把时间戳转换成java.util.Date对象
        Date triggerTime=new Date(deviceCheckTime);
//        定时触发器 1分钟后触发

        Trigger trigger = TriggerBuilder.newTrigger()
                .startAt(triggerTime)
                .build();

//        调度器 把任务和触发器进行绑定
//        调度器 scheduler ， 让任务 JobDetail 和 按照 触发器的时间 来触发
        scheduler.scheduleJob(jobDetail,trigger);
//        启动调度器
        scheduler.start();



    }


    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        log.debug("设备检测任务执行了");
//        jobExecutionContext 获取任务详情的数据对象 JobDataMap

        JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();
//        获取订单号
        String orderNo = jobDataMap.getString("orderNo");
        Integer gunId = jobDataMap.getInt("gunId");
        log.debug("设备自检任务-获取订单号:{},枪ID：{}",orderNo,gunId);
//        不在容器中的DeviceCheckJob 想要调用容器中的mapper 来处理数据
//        可以参考mqtt与mqttConsumer 通过构造器或通过setter方法注入
//        这里使用工具类获取容器中的对象
//        OrderSuccessMapper orderSuccessMapper = SpringContextUtils.getBean(OrderSuccessMapper.class);
//        OrderFaileMapper orderFaileMapper = SpringContextUtils.getBean(OrderFaileMapper.class);
        OrderRepository orderRepository = SpringContextUtils.getBean(OrderRepository.class);



//        QueryWrapper queryWrapper = new QueryWrapper();
//        queryWrapper.eq("billId",orderNo);

        log.debug("查询成功订单记录：订单号：{}",orderNo);
        ChargingOrderSuccessPO successOrder = orderRepository.getSuccessOrder(orderNo);
//        判断是否有成功订单记录
        if (successOrder == null){
//            没有成功订单记录
            log.debug("没有成功订单记录，查询是否有失败订单记录");
            log.debug("查询失败订单记录：订单号：{}",orderNo);
            ChargingOrderFailPO chargingOrderFailPO= orderRepository.getFailOrder(orderNo);
            log.debug("查询失败订单记录：{}",chargingOrderFailPO);
//            判断是否有失败订单记录
            if(chargingOrderFailPO==null){
//                没有失败订单记录，也没有成功订单记录，插入失败订单记录 同时记录失败原因
                ChargingOrderFailPO po=new ChargingOrderFailPO();
                po.setBillId(orderNo);
                po.setFailDesc("设备自检失败-设备无反应");
                log.debug("保存订单失败信息:{}",po);
                Integer row=orderRepository.saveFailOrder(po);
                log.debug("保存订单失败信息{}，受影响行数:{}",po,row);
                log.debug("设备自检失败-设备无响应，通知用户和维修人员");
                log.debug("给用户发送优惠券 表示歉意 给用户心灵上的安慰");



            }else {
                log.debug("有失败订单记录，失败原因：{}",chargingOrderFailPO.getFailDesc());
                log.debug("无需处理");
            }


        }else {
            log.debug("有成功订单记录，无需处理");
        }




    }
}
